home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
MAGICSYS.I
< prev
next >
Wrap
Text File
|
1991-06-08
|
7KB
|
273 lines
(*#######################################################################
MAGIC Modula's All purpose GEM Interface Cadre
¯ ¯ ¯ ¯ ¯
########################################################################
MAGICSYS System-Spezialitäten
Dieses Modul soll Inkompatibilitäten zwischen den einzel-
nen Compilern aufheben.
WARNUNG: Dieses Modul ist auf ABSOLUT UNTERSTER EBENE!!!
Implementation für Megamax-Modula-2
#########################################################################
V2.00 17.10.90 Peter Hellinger
V1.00 (c) by Peter Hellinger
#######################################################################*)
IMPLEMENTATION MODULE MagicSys;
(*----- MM2-Compilerswitches -----------*)
(* *)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*--------------------------------------*)
FROM SYSTEM IMPORT BYTE, WORD, ADDRESS, LONGWORD, ASSEMBLER;
IMPORT SYSTEM, PrgCtrl;
VAR cast2: RECORD
CASE : CARDINAL OF
0: hi: LOC;
lo: LOC;|
1: int: sINTEGER;|
2: card: sCARDINAL;|
3: set: sBITSET;|
4: wrd: sWORD;|
END;
END;
VAR cast4: RECORD
CASE : CARDINAL OF
0: b1: LOC;
b2: LOC;
b3: LOC;
b4: LOC;|
1: int: lINTEGER;|
2: crd: lCARDINAL;|
3: set: lBITSET;|
4: wrd: lWORD;|
5: adr: ADDRESS;|
END;
END;
PROCEDURE CastToChar (value: ARRAY OF LOC): CHAR;
BEGIN
RETURN CHAR (value[HIGH (value)]);
END CastToChar;
PROCEDURE CastToByte (value: ARRAY OF LOC): Byte;
BEGIN
RETURN BYTE (value[HIGH (value)]);
END CastToByte;
PROCEDURE CastToByteset (value: ARRAY OF LOC): ByteSet;
BEGIN
RETURN ByteSet (value[HIGH (value)]);
END CastToByteset;
PROCEDURE CastToInt (value: ARRAY OF LOC): sINTEGER;
BEGIN
IF HIGH (value) = 0 THEN
cast2.int:= 0;
cast2.lo:= value[0];
ELSE
cast2.hi:= value[HIGH (value)-1];
cast2.lo:= value[HIGH (value)];
END;
RETURN cast2.int;
END CastToInt;
PROCEDURE CastToCard (value: ARRAY OF LOC): sCARDINAL;
BEGIN
IF HIGH (value) = 0 THEN
cast2.card:= 0;
cast2.lo:= value[0];
ELSE
cast2.hi:= value[HIGH (value)-1];
cast2.lo:= value[HIGH (value)];
END;
RETURN cast2.card;
END CastToCard;
PROCEDURE CastToBitset (value: ARRAY OF LOC): sBITSET;
BEGIN
IF HIGH (value) = 0 THEN
cast2.set:= {};
cast2.lo:= value[0];
ELSE
cast2.hi:= value[HIGH (value)-1];
cast2.lo:= value[HIGH (value)];
END;
RETURN cast2.set;
END CastToBitset;
PROCEDURE CastToWord (value: ARRAY OF LOC): sWORD;
BEGIN
IF HIGH (value) = 0 THEN
cast2.int:= 0;
cast2.lo:= value[0];
ELSE
cast2.hi:= value[HIGH (value)-1];
cast2.lo:= value[HIGH (value)];
END;
RETURN cast2.wrd;
END CastToWord;
PROCEDURE CastToLInt (value: ARRAY OF LOC): lINTEGER;
BEGIN
CASE HIGH (value) OF
0: cast4.int:= 0H;
cast4.b4:= value[0];
|
1: cast4.int:= 0H;
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
|
ELSE cast4.b1:= value[HIGH (value)-3];
cast4.b2:= value[HIGH (value)-2];
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
END;
RETURN cast4.int;
END CastToLInt;
PROCEDURE CastToLCard (value: ARRAY OF LOC): lCARDINAL;
BEGIN
CASE HIGH (value) OF
0: cast4.crd:= 0H;
cast4.b4:= value[0];
|
1: cast4.crd:= 0H;
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
|
ELSE cast4.b1:= value[HIGH (value)-3];
cast4.b2:= value[HIGH (value)-2];
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
END;
RETURN cast4.crd;
END CastToLCard;
PROCEDURE CastToLBitset (value: ARRAY OF LOC): lBITSET;
BEGIN
CASE HIGH (value) OF
0: cast4.set:= lBITSET{};
cast4.b4:= value[0];
|
1: cast4.set:= lBITSET{};
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
|
ELSE cast4.b1:= value[HIGH (value)-3];
cast4.b2:= value[HIGH (value)-2];
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
END;
RETURN cast4.set;
END CastToLBitset;
PROCEDURE CastToLWord (value: ARRAY OF LOC): lWORD;
BEGIN
CASE HIGH (value) OF
0: cast4.crd:= 0;
cast4.b4:= value[0];
|
1: cast4.crd:= 0;
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
|
ELSE cast4.b1:= value[HIGH (value)-3];
cast4.b2:= value[HIGH (value)-2];
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
END;
RETURN cast4.wrd;
END CastToLWord;
PROCEDURE CastToAddr (value: ARRAY OF LOC): ADDRESS;
BEGIN
CASE HIGH (value) OF
0: cast4.crd:= 0H;
cast4.b4:= value[0];
|
1: cast4.crd:= 0H;
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
|
ELSE cast4.b1:= value[HIGH (value)-3];
cast4.b2:= value[HIGH (value)-2];
cast4.b3:= value[HIGH (value)-1];
cast4.b4:= value[HIGH (value)];
END;
RETURN cast4.adr;
END CastToAddr;
PROCEDURE Basepage (): ADDRESS;
VAR adr: ADDRESS;
BEGIN
PrgCtrl.GetBasePageAddr (adr);
RETURN adr;
END Basepage;
PROCEDURE Terminate (return: sINTEGER);
BEGIN
PrgCtrl.TermProcess (return);
END Terminate;
PROCEDURE CallGEM (function: sINTEGER; parablock: ADDRESS);
BEGIN
ASSEMBLER
MOVE.W function(A6), D0
MOVE.L parablock(A6), D1
TRAP #2
END;
END CallGEM;
PROCEDURE VqGdos (): BOOLEAN;
VAR x: LONGINT;
BEGIN
ASSEMBLER
MOVE.L #-2, D0
TRAP #2
MOVE.L D0, x(A6)
END;
RETURN x # -2L;
END VqGdos;
PROCEDURE CatchD0 (): LONGCARD;
VAR x: LONGCARD;
BEGIN
ASSEMBLER
MOVE.L D0, x(A6)
END;
RETURN x;
END CatchD0;
END MagicSys.